/*
 * SPDX-FileCopyrightText: 2022-2023 Andrew Gunnerson
 * SPDX-License-Identifier: GPL-3.0-only
 */

package com.sanji.audio_test

import android.Manifest
import android.annotation.SuppressLint
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Build
import android.os.PowerManager
import android.provider.Settings
import androidx.core.content.ContextCompat

/**
 * 权限管理对象
 * 用于检查和管理应用所需的各种权限
 */
object Permissions {
    // 通知权限数组，Android 13及以上版本需要
    private val NOTIFICATION: Array<String> =
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            arrayOf(Manifest.permission.POST_NOTIFICATIONS)
        } else {
            arrayOf()
        }

    // 必需权限数组，包括录音权限和通知权限
    val REQUIRED: Array<String> = arrayOf(Manifest.permission.RECORD_AUDIO) + NOTIFICATION
    // 可选权限数组，用于增强功能但非必需
    val OPTIONAL: Array<String> = arrayOf(
        Manifest.permission.READ_CALL_LOG,
        Manifest.permission.READ_CONTACTS,
        Manifest.permission.READ_PHONE_STATE,
    )

    /**
     * 检查是否已授予通话录音所需的所有权限
     * @param context 应用上下文
     * @return 如果所有必需权限都已授予返回true，否则返回false
     */
    fun haveRequired(context: Context): Boolean =
        REQUIRED.all {
            ContextCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
        }

    /**
     * 检查当前是否为此应用禁用了电池优化
     * @param context 应用上下文
     * @return 如果已禁用电池优化返回true，否则返回false
     */
    fun isInhibitingBatteryOpt(context: Context): Boolean {
        val pm: PowerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
        return pm.isIgnoringBatteryOptimizations(context.packageName)
    }

    /**
     * 获取用于在系统设置中打开应用信息页面的意图
     * @param context 应用上下文
     * @return 配置好的意图对象
     */
    fun getAppInfoIntent(context: Context) = Intent(
        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
        Uri.fromParts("package", context.packageName, null),
    )

    /**
     * 获取用于请求为此应用禁用电池优化的意图
     * @param context 应用上下文
     * @return 配置好的意图对象
     */
    @SuppressLint("BatteryLife")
    fun getInhibitBatteryOptIntent(context: Context) = Intent(
        Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS,
        Uri.fromParts("package", context.packageName, null),
    )

    /**
     * 获取用于打开电池优化设置的意图，以便用户可以重新启用它
     * @return 配置好的意图对象
     */
    fun getBatteryOptSettingsIntent() = Intent(
        Settings.ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS,
    )
}